from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.utils import timezone

class UserManager(BaseUserManager):
    """
    用户管理器：用于创建普通用户和超级用户
    """
    def create_user(self, username, password=None, **extra_fields):
        """
        创建普通用户
        :param username: 用户名，必填
        :param password: 密码，必填
        :param extra_fields: 其他字段
        :return: user对象
        """
        if not username:
            raise ValueError('用户名必须填写')
        user = self.model(username=username, **extra_fields)
        user.set_password(password)  # 密码加密存储
        user.save(using=self._db)
        return user

    def create_superuser(self, username, password, **extra_fields):
        """
        创建超级用户
        :param username: 用户名
        :param password: 密码
        :param extra_fields: 其他字段
        :return: user对象
        """
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        return self.create_user(username, password, **extra_fields)

class User(AbstractBaseUser, PermissionsMixin):
    """
    用户表模型，存储用户账号核心信息，支持登录、权限及基础标识功能。
    """
    username = models.CharField(max_length=50, unique=True, null=False, help_text='登录用户名，唯一')
    password = models.CharField(max_length=255, null=False, help_text='加密密码，禁止明文')
    phone = models.CharField(max_length=20, unique=True, null=True, blank=True, help_text='手机号，唯一，可为空')
    email = models.EmailField(max_length=100, unique=True, null=True, blank=True, help_text='邮箱，唯一，可为空')
    avatar = models.ImageField(upload_to='avatars/', default='avatars/system_default_avatar.png', help_text='头像图片，默认系统头像')
    last_login_time = models.DateTimeField(null=True, blank=True, help_text='最后登录时间')
    status = models.SmallIntegerField(default=1, help_text='账号状态（1-正常，0-禁用）')
    created_at = models.DateTimeField(default=timezone.now, help_text='账号创建时间')
    updated_at = models.DateTimeField(auto_now=True, help_text='信息更新时间')
    is_staff = models.BooleanField(default=False, help_text='是否为后台管理用户')

    USERNAME_FIELD = 'username'  # 用于登录的唯一标识字段
    REQUIRED_FIELDS = []  # 创建超级用户时需要填写的额外字段

    objects = UserManager()  # 指定自定义用户管理器

    class Meta:
        db_table = 'users'
        verbose_name = '用户'
        verbose_name_plural = '用户'

    def __str__(self):
        """
        返回用户友好显示名
        """
        return self.username
